package kiv.pt;

import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;

/**
 * Zastupuje odběrné místo.
 * @author Zdeněk Janeček
 */
public class OdberneMisto {
    private final Point2D.Double coord;
    private final int id;
    private final boolean typ;

    private final List<Integer> sousedi;
    private Integer[] sousediPublic = null;
    
    private double prikon;
    private double iprikon;
    
    /**
     * Pole označující, zda je možné dodávat energii ze zdroje
     * s id shodném s pozicí.
     */
    public int[] powSuppliers = new int[11];
    
    /**
     * Pole vzdáleností s nejkratšími vzdálenostmi do zdroje
     * s id shodném s pozicí
     */
    public double[] powDists = new double[11];
    
    /**
     * Odběrné místo může být jak domácnost, tak firma.
     * 
     * @param coord
     *            Souřadnice tohoto objektu.
     * @param pocetSousedu
     *            Aby konstruktor věděl na kolik se má připravit sousedů. Může
     *            být ale libovolně velký.
     * @param id
     *            Id je současně indexem do pole {@code DataGuru.mista}.
     * @param typ
     *            Je li true, jedná se o firmu a naopak, jedná se o domácnost.
     *            Tyto dva typy se liší v charakteru změny příkonu.
     * @param iprikon Počáteční příkon
     */
    public OdberneMisto(Point2D.Double coord, int pocetSousedu, int id,
            boolean typ, double iprikon) {
        this.coord = coord;
        this.id = id;
        this.typ = typ;
        this.iprikon = iprikon;
        
        prikon = iprikon;
        sousedi = new ArrayList<Integer>(pocetSousedu);
    }

    /**
     * Aktuální příkon.
     * 
     * @return příkon v kW
     */
    public double getPrikon() {
        return prikon;
    }
    
    /**
     * Nastavý aktuální hodnotu příkonu.
     * @param p hodnota v kWh
     */
    public void setPrikon(Double p) {
        prikon = p;
    }

    /**
     * Vrátí počáteční hodnotu příkonu.
     * @return hodnota v kWh
     */
    public double getiPrikon() {
        return iprikon;
    }
    
    /**
     * Nastavý počáteční hodnotu příkonu.
     * @param p hodnota v kWh
     */
    public void setiPrikon(Double p) {
        this.iprikon = p;
    }
    
    /**
     * Souřadnice tohoto odběrného místa.
     * 
     * @return dvojrozměrný bod
     */
    public Point2D.Double getCoordinates() {
        return coord;
    }

    /**
     * ID odběrného místa
     * @return celočíselná hodnota
     */
    public int getId() {
        return id;
    }

    /**
     * false v případě domácnosti, true v případě firmy.
     * 
     * @return Logická hodnota označující typ spotřebitele.
     */
    public boolean isFirma() {
        return typ;
    }

    /**
     * Index odběrného místa.
     * 
     * @param m Index do pole {@code DataGuru.mista}.
     */
    public void addSoused(Integer m) {
        sousedi.add(m);
        sousediPublic = sousedi.toArray(new Integer[sousedi.size()]);
    }

    /**
     * Pole indexů sousedů. Použitelné přímo do pole {@code DataGuru.mista}.
     * @return celočíselná hodnota
     */
    public Integer[] seznamSousedu() {
        if (sousediPublic == null) {
            sousediPublic = sousedi.toArray(new Integer[sousedi.size()]);
        }
        return sousediPublic;
    }
}
